home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Network Supervisor's Toolkit
/
Network Supervisor's Toolkit.iso
/
printers
/
iprint
/
iprint.c
< prev
next >
Wrap
Text File
|
1996-07-10
|
38KB
|
796 lines
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Program : IPRINT. Nprint version IRCI */
/* Author : Marc Chauffour */
/* Date-written : 02/13/90 02:31pm */
/* Last-updated : 03/13/90 11:11am */
/* */
/* Update : 1.10 02/16/90 Copie file server si possible, modification des */
/* libelles job decription et path file. */
/* 1.11 02/16/90 Possibilite de demander copy standard /NC */
/* 1.12 02/19/90 Iprint *.LST possible */
/* 1.13 02/20/90 FileServerCopy est correcte ou copie standard */
/* 1.14 02/20/90 On beep si probleme */
/* 1.15 02/20/90 Remaniement avec philippe et Test version DOS */
/* 1.16 02/20/90 Ph.A. buffer de 32Ko */
/* 1.17 02/21/90 C.m. Option /S plus affichage progression copy */
/* 1.18 02/22/90 Affichage taille reellement copiee */
/* 1.20 02/23/90 /F=forms name avec NET$PRN.DAT */
/* 1.21 02/23/90 Preferred, Primary et Default server si echec */
/* 1.22 03/01/90 Ph.A. Modif libelle */
/* 1.23 03/13/90 Teste la presence de NET3, La version de Novell */
/* 1.24 03/19/90 Ph.A. Modif libelle */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* */
/* */
/* IPRINT filename /f=Form_name /c=Copies_number /q=Queue_name */
/* /t=TabSize /NT /NC /S */
/* */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Inclusion des headers */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
#define _NIT_H
#include "z:\novellc\include\nwbindry.h"
#include "z:\novellc\include\nwconn.h"
#include "z:\novellc\include\nwfile.h"
#include "z:\novellc\include\nwmisc.h"
#include "z:\novellc\include\nwwrkenv.h"
#include "z:\novellc\include\nitq.h"
#include "z:\novellc\include\niterror.h"
#include <string.h>
#include <stdlib.h>
#include <io.h>
#include <stdio.h>
#include <conio.h>
#include <dir.h>
#include <fcntl.h>
#include <dos.h>
#include <sys\stat.h>
#include "..\tc\fullypth.h"
#define CAVAMAL -1 /* En cas de probleme */
#define DEFAUT -1 /* Valeur par defaut */
#define OK 0 /* Tout est Ok */
#define ARGERR 1 /* Argument Error */
#define NOSERVER 2 /* Not attached to server */
#define NOQUEUE 3 /* Queue not found */
#define NOPRINTSERV 4 /* No print server */
#define NEWJOBERR 5 /* Unable to create new job */
#define NOFILE 6 /* File not found */
#define COPYERR 7 /* File copy error */
#define STARTERR 8 /* Start Error */
#define VERSERR 9 /* Dos version error */
#define NOMEM 10 /* Not enough memory to MALLOC. */
#define NOFRMSF 11 /* No Forms FIle */
#define BADFRMSF 12 /* Mauvais fichier NET$PRN.DAT */
#define ZEROFRMS 13 /* Pas de forms dans le fichier */
#define UNKNOWNF 14 /* Forms inconnu */
#define NONOVELL 15 /* Pas de novell charge */
#define VERSNOVELL 16 /* Version trop vieille */
#define MAXLINES 66 /* Nombre maxi de lignes */
#define MAXCHAR 132 /* Nombre maximum de caracteres */
#define TAILLEBUF 32*1024U /* Gros Buffer. */
#define LENGTHDEF 66 /* Length papier par defaut */
#define WIDTHDEF 132 /* Width papier par defaut */
#define SRCHNUM -2 /* Recherche numerique du form */
#define SRCHTXT 0 /* recherche par nom du form */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Acces a NET$PRN.DAT Dans PUBLIC */
/* On a tout d'abord une fin de fichier a chercher 0Dh 0Ah 1Ah */
/* BYTE - DUP(8) constant */
/* DWORD - ??? */
/* DWORD - position info Device (Zero si pas de device) */
/* DWORD - position indo Forms (Zero si pas de forms) */
/* DWORD - Position de la prochaine place libre */
/* DWORD - 00 00 00 00 */
/* -------------------------------------------------------------------------*/
/* Zone FORMS : */
/* BYTE - longueur du forms name */
/* BYTE - DUP(longueur du forms name) */
/* WORD - numero de forms */
/* WORD - width (largeur de la page) */
/* WORD - length (nombre de lignes) */
/* BYTE - DUP(longueur du forms name) */
/* DWORD - position du debut de zone FORMS */
/* DWORD - 00 00 00 00 */
/* BYTE - 00 */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Variables globales */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int nbarg; /* Nombre d'argument */
char qdefault[48]="Q_TEXT"; /* Nom de la queue par defaut */
char ficcfg[80]="/SYS:PUBLIC\\NET$PRN.DAT";
int formsdef=0; /* forms si rien de specifie */
char *qname=NULL; /* Nom de la queue concernee */
int copy=DEFAUT; /* Nombre de copie */
int forms=DEFAUT; /* Forms pas initialise */
char formsname[12]=""; /* Nom de forms par defaut */
int formslength=DEFAUT; /* Length papier */
int formswidth=DEFAUT; /* width papier */
int stream=DEFAUT; /* par defaut text Tabs=O */
int sizetab=DEFAUT; /* Tab Size */
int copymsg=DEFAUT; /* Message pendant la phase de copy */
char fullypath[255]; /* Buffer du nom fichier */
int flagcopy=DEFAUT; /* copy reseau inhibe */
char *buffer; /* Pointeur au buffer de copie. */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Declarations des fonctions */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int testarg(char **); /* Teste la liste des arguments */
int test(char *); /* Teste un argument */
int copyfile(int, char *); /* Copy d'un fichier sur l'autre */
int traitfile(char *); /* Traitement d'un fichier */
int srchfrms( void ); /* on cherche le numero de forms */
int main(int, char**); /* Fonction principale */
int testnovell( void); /* regarde si novell present */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* testarg : Verifie si les arguments sont correct */
/* Sortie : (int) CAVAMAL - Mauvais argument */
/* 0 - Pas de probleme */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int testarg(
char **listarg) /* Liste des arguments */
{
int i; /* Compteur de boucle for */
int nbargu; /* Nombre d'argument */
nbargu = nbarg; /* Egal au nombre d'argument passe */
switch(nbarg) { /* en fonction du nombre d'argument */
case 2 :
if (strncmp("/",listarg[1],1) != 0) /* Si on a un nom de fichier Ok */
return(OK); /* On peut sortir sans probleme */
else
return(CAVAMAL); /* On peut sortir sans probleme */
default :
if (strncmp("/",listarg[1],1) != 0) /* Si on a un nom de fichier Ok */
{
for (i = 2; i<nbargu; i++)
if(test(listarg[i]) == CAVAMAL) /* On teste le premier argument */
return(CAVAMAL); /* On sort avec erreur */
return(OK); /* On sort avec result de TEST */
}
else
return(CAVAMAL); /* Pas bon */
}
}
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Fonction test */
/* Rend CAVAMAL si probleme et Zero autrement */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int test(char *arg)
{
if (strncmp("/",arg,1) != 0) /* Si on a un nom de fichier Ok */
return(CAVAMAL); /* Pas de nom de fichier */
if (strnicmp("/Q=",arg,3) == 0) /* Si on demande une Queue specifiq */
if (qname != NULL) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
if(strlen(&arg[3]) > 0) /* Si on a quelque chose derriere */
{
qname=&arg[3]; /* on lui met l'adresse qu'il faut */
--nbarg; /* Un argument en moins */
return(OK); /* Ok pas de probleme, on a le droit*/
}
else
return(CAVAMAL); /* On ne peut pas */
if (stricmp("/NT",arg) == 0) /* Si on demande un mode stream */
if (stream!=DEFAUT) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
{
stream=0; /* on lui met le stream */
--nbarg; /* Un argument en moins */
return(OK); /* Ok pas de probleme, on a le droit*/
}
if (stricmp("/S",arg) == 0) /* Si on demande pas d'affic. copy */
if (copymsg!=DEFAUT) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
{
copymsg=0; /* on lui met le non affichage */
--nbarg; /* Un argument en moins */
return(OK); /* Ok pas de probleme, on a le droit*/
}
if (stricmp("/NC",arg) == 0) /* Si on demande pas NET COPY */
if (flagcopy!=DEFAUT) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
{
flagcopy=1; /* on lui met le copy standard */
--nbarg; /* Un argument en moins */
return(OK); /* Ok pas de probleme, on a le droit*/
}
if (strnicmp("/C=",arg,3) == 0) /* Si on demande nombre de copies */
if (copy != DEFAUT) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
if(strlen(&arg[3]) > 0) /* Si on a quelque chose derriere */
{
copy=atoi(&arg[3]); /* On prend notre nombre de copies */
if (copy == 0) /* si n'importe quoi */
return(CAVAMAL); /* on le dit ! */
else
{
--nbarg; /* Un argument en moins */
return(OK); /* C'est Ok */
}
}
else
return(CAVAMAL); /* On ne peut pas */
if (strnicmp("/T=",arg,3) == 0) /* Si on demande tab size */
if (sizetab != DEFAUT) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
if(strlen(&arg[3]) > 0) /* Si on a quelque chose derriere */
{
sizetab=atoi(&arg[3]); /* On prend notre nombre de copies */
if (sizetab < 0 || sizetab >18 ) /* si n'importe quoi */
return(CAVAMAL); /* on le dit ! */
else
{
--nbarg; /* Un argument en moins */
return(OK); /* C'est Ok */
}
}
else
return(CAVAMAL); /* On ne peut pas */
if (strnicmp("/F=",arg,3) == 0) /* Si on demande forms */
if (forms != DEFAUT) /* Si on est deja passe */
return(CAVAMAL); /* On sort avec un probleme */
else
if(strlen(&arg[3]) > 0) /* Si on a quelque chose derriere */
if(arg[3]<'0' || arg[3]>'9') /* Si c'est de l'alphanumerique */
{
strcpy(formsname,&arg[3]); /* On prend notre forms */
--nbarg; /* Un argument en moins */
forms=SRCHTXT; /* on peut signaler que FORMS name */
return(OK); /* C'est Ok */
}
else
{
formsdef=atoi(&arg[3]); /* On prend notre forms */
forms=SRCHNUM; /* on peut signaler que FORMS num */
--nbarg; /* Un argument en moins */
return(OK); /* C'est Ok */
}
else
return(CAVAMAL); /* On ne peut pas */
return(CAVAMAL);
}
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* copyfile( fichier a editer ) */
/* en sortie : Ok si tout va bien */
/* autrement code erreur */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int copyfile
(
int hdleout, /* Dos handle fichier OUT */
char *nomfichier) /* Nom du fichier en entree */
{
int hdlein; /* Handle fichier In */
unsigned long longfic; /* Longeur du fichier IN */
unsigned long longcopied; /* longueur deja effectue */
unsigned long posit=0; /* Position dans le fichier IN */
int result; /* Resultat des fonctions */
unsigned long taille=0; /* Taille en Ko */
hdlein=open(nomfichier,
O_RDONLY|O_DENYNONE|O_BINARY,
S_IFREG); /* Ouvre IN en SHARE/READ ONLY */
if (hdlein==CAVAMAL) /* Si le fichier n'existe pas */
return(CAVAMAL); /* on le signale */
longfic=filelength(hdlein); /* On prend sa taille */
if (fullypath[1]==':' || flagcopy==1) /* Drive local */
result=1; /* On force la copie maison */
else
{
longcopied=0; /* On initialise la longueur copiee */
printf("Server copy of %lu bytes.",longfic);
gotoxy(1,wherey()); /* Debut de ligne */
result=FileServerFileCopy(hdlein,hdleout,
0,0,longfic, /* si la copie server ne marche pas */
(long *)&longcopied); /* on va essayer autre chose */
}
printf(" ");
gotoxy(1,wherey()); /* Debut de ligne */
if (result!=OK || longcopied!=longfic)/* En cas de probleme */
while(posit<longfic) /* Tant qu'on doit copier */
{
result=read(hdlein,buffer,(unsigned) TAILLEBUF);/* Lecture fichier IN */
if (result==CAVAMAL) /* En cas de probleme */
{
close(hdlein); /* On ferme le fichier */
return(CAVAMAL); /* On le signale dehors */
}
if (write(hdleout,buffer,result)!=result)
{ /* Disk full. */
close(hdleout);
close(hdlein); /* on termine */
return(CAVAMAL); /* On sort avec probleme */
}
posit+=(unsigned int) result; /* On signale ou on est */
taille+=(unsigned) result; /* Quelques bytes de plus */
gotoxy(1,wherey()); /* Debut de ligne */
if (copymsg==DEFAUT) printf("Spooling %lu Kb",taille/1024);
}
gotoxy(1,wherey()); /* Debut de ligne */
printf(" ");
gotoxy(1,wherey()); /* Debut de ligne */
close(hdlein); /* On ferme notre fichier IN */
return(OK); /* C'est ok */
}
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* traitfile( fichier a editer ) */
/* en sortie : Ok si tout va bien */
/* autrement code erreur */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int traitfile
(
char *nomfichier /* Nom du fichier a editer */
)
{
long queueid; /* ID de la queue demandee */
JobStruct job; /* Structure de type Job */
WORD connect; /* Connection number */
int result; /* Resultat fonction */
char user[48]; /* Utilisateur */
WORD usertype; /* Type du user */
long userid; /* Object ID */
BYTE logintime[7]; /* Login Time */
char drive[MAXDRIVE]; /* Unite du disque */
char dir[MAXDIR]; /* Repertoire */
char filename[MAXFILE]; /* nom du fichier */
char ext[MAXEXT]; /* Extension */
struct ClientRecordArea *pcra; /* Pointeur a la strcuture */
int drivenb; /* Numero de drive */
char *pdrivenb; /* pointeur au char drive */
int filehandle; /* FIle handle file job */
struct ftime ftimep; /* structure informations date:time */
long lgfile; /* Longueur du fichier */
memset(&job,0,sizeof(job)); /* Initialise a zero */
filehandle=open(nomfichier,
O_RDONLY|O_DENYNONE|O_BINARY,
S_IFREG); /* Ouvre IN en SHARE/READ ONLY */
if(filehandle==CAVAMAL) /* Si il n'existe pas */
{
printf("File not found : %s\n\7",nomfichier);
return(NOFILE);
}
else
{
lgfile=filelength(filehandle); /* Longueur du fichier */
getftime(filehandle,&ftimep); /* Date de modification fichier */
close(filehandle); /* fichier plus ouvert */
}
if (lgfile==0) /* ca ne sert a rien */
{
printf("File %s is empty.\n\7",nomfichier);
return(OK); /* erreur non critique */
}
if (GetBinderyObjectID(qname, OT_PRINT_QUEUE, &queueid))
{
printf("Unable to locate print queue %s\n\7", strupr(qname));
return(NOQUEUE);
}
connect=GetConnectionNumber(); /* Recupere Connection Number */
result=GetConnectionInformation(
connect, /* par rapport a CONNECT */
user, /* Object name */
&usertype, /* Type du user */
&userid, /* User ID */
logintime); /* Login time */
printf("Submitting %s to %s (user %s).\n",nomfichier,
strupr(qname),
user);
job.targetServerIDNumber=DEFAUT; /* ID du serveur QUEUE */
strcpy(job.targetExecutionTime,"\xFF\xFF\xFF\xFF\xFF\xFF");
job.jobType=forms; /* Numero du forms */
fnsplit(nomfichier,drive,dir,filename,ext);
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Remplissage de la client record Area */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
pcra = (struct ClientRecordArea *) job.clientRecordArea;
pcra->version=0; /* Comme les autres soft */
pcra->tabsize=sizetab; /* Position des tabs */
pcra->copies=IntSwap(copy); /* Nombre d'exemplaires */
pcra->cflags=(WORD) (0x80 + 0x40); /* Banner printed */
if (stream!=DEFAUT) /* Si on a demande le stream */
pcra->cflags=(WORD) (0x80); /* Banner sans text stream */
pcra->cflags=IntSwap(pcra->cflags); /* ordre inverse */
pcra->maxlines= IntSwap(formslength); /* Lignes au maximum */
pcra->maxchar= IntSwap(formswidth); /* Characteres au maximum */
strcpy(pcra->formname,formsname); /* Pas de forms */
strncpy(pcra->b_name,user,12); /* Nom utilisateur */
pcra->b_name[13]='\0'; /* On force la fin au cas ou */
strcpy(pcra->b_filename,filename); /* Filename sans extension */
strcat(pcra->b_filename,ext); /* Voila l'extension */
strcpy(pcra->h_filename,pcra->b_filename);
sprintf(job.textJobDescription,
"%s (%lu bytes, %02u-%02u-%04u %02u:%02u)",
pcra->b_filename,
lgfile,
ftimep.ft_month,
ftimep.ft_day,
ftimep.ft_year+1980,
ftimep.ft_hour,
ftimep.ft_min);
if (drive[0] == '\0') /* pas de drive ? */
{
drivenb = getdisk(); /* drive courant */
pdrivenb = (unsigned char *)&drivenb; /* adresse drive */
drive[0] = (*pdrivenb) + 'A'; /* lettre drive */
drive[1] = ':'; /* + ':' */
drive[2] = '\0'; /* + zero binaire */
}
else
{
pdrivenb = drive; /* lettre drive */
drivenb = (int)(pdrivenb[0] - 'A'); /* numero drive */
}
strcpy(fullypath,drive); /* Drive en cours */
strcat(fullypath,dir); /* On a le path du fichier */
strcat(fullypath,pcra->h_filename); /* On a le nom complet */
getnovellpath(fullypath,fullypath); /* On regarde ce que ca donne */
strncpy(pcra->path,fullypath,80);
result=CreateQueueJobAndFile(queueid, /* ID de la queue */
&job, /* Pointeur a la structure JOB */
&filehandle); /* DOS file handle pour JobFIle */
if (result!=OK) /* Si on a eu des problemes */
{
printf("CreateQueueJobAndFile failed, error %u. Aborted.\n\7",result);
return(NEWJOBERR); /* Error level */
}
if(copyfile(filehandle,nomfichier)==CAVAMAL) /* copie des fichiers */
{
printf("Error spooling data to %s \n\7",job.jobFileName);
CloseFileAndAbortQueueJob(queueid,job.jobNumber,filehandle);
return(COPYERR); /* Error level */
}
if (CloseFileAndStartQueueJob(queueid,job.jobNumber,filehandle)==OK)
return(OK); /* Pas de probleme */
else
{
CloseFileAndAbortQueueJob(queueid,job.jobNumber,filehandle);
printf("CloseFileAndStartQueueJob failed. Aborted.\n\7");
return(STARTERR); /* Erreur lors de START */
}
}
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* srchfrms : recherche le forms formname dans NET$PRN.DAT */
/* le nom du fichier est contenu dans ficcfg[] */
/* il faut trouver le nom du preferred server pour lui packer, ou celui */
/* du Primary server (login), ou le Default server */
/* sortie : OK si tout va bien, CAVAMAL autrement */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int srchfrms( void )
{
int fic_in; /* File handle */
int result; /* resultat des fonctions appelees */
long longfic; /* longueur du fichier */
long i; /* indice de boucle */
int j; /* idem */
char nomforms[12]; /* nom du forms */
char numforms; /* Numero de forms */
int sizel; /* Length de la page */
int sizew; /* width de la page */
int nbcol=4; /* Nombre de colonne de forms */
char *deplace; /* pointeur a une chaine de caract. */
int nbforms; /* Nombre de forms */
long *positf; /* positionnement des forms */
WORD serverpref; /* Preferred server */
char pluriel='s'; /* singulier ou pluriel ? */
/* on va constituer le nom du fichier NET$PRN.DAT a l'aide du preferred serv*/
serverpref=GetPreferredConnectionID();
if (serverpref==0) /* pas de Set preferred de fait */
{
serverpref=GetPrimaryConnectionID();
if (serverpref==0) /* pas de Set preferred de fait */
serverpref=GetDefaultConnectionID();
}
GetFileServerName(serverpref, /* connection ID du serveur princip.*/
fullypath); /* Nom du serveur */
strcat(fullypath,ficcfg); /* On lui ajoute le nom du fichier */
fic_in=open(fullypath,
O_RDONLY|O_DENYNONE|O_BINARY,
S_IFREG); /* Ouvre IN en SHARE/READ ONLY */
if(fic_in==CAVAMAL) /* En cas de probleme */
{
printf("%s not found.\7\n",fullypath);
return(NOFRMSF); /* No forms FIle */
}
longfic=filelength(fic_in); /* longueur du fichier */
buffer=malloc((size_t) longfic); /* Alloue le buffer de lecture */
if (buffer==NULL)
{
printf("Not enough heap memory...\n\7");
close(fic_in); /* on libere le fichier */
return(NOMEM); /* Pas assez de memoire */
}
result = read(fic_in,buffer,(int) longfic); /* On charge tout le fichier */
if (result!=longfic) /* si on a pas le compte ... */
{
printf("Bad %s !\7\n",fullypath);
close(fic_in); /* on ferme le fichier */
free(buffer); /* on libere la memoire */
return(BADFRMSF); /* On a un probleme */
}
deplace=buffer; /* adresse du buffer alloue */
for(i=0;*deplace!='\x1A' && i<longfic;i++,deplace++); /* on recherche 1A */
if(i==longfic) /* On est deja a la fin */
{
printf("Bad %s !\7\n",fullypath);
close(fic_in); /* on le ferme */
free(buffer); /* on libere la memoire */
return(BADFRMSF); /* on sort */
}
deplace+=17; /* deplacement pour arriver au point*/
/* info forms. */
positf=(long *) deplace; /* on prend position en adr. long */
/* si on a pas de FORMS */
if (deplace==NULL || (char) buffer[(int) *positf]=='\0')
{
printf("No form defined in %s.\7\n",fullypath);
close(fic_in); /* on le ferme */
free(buffer); /* on libere la memoire */
return(ZEROFRMS); /* on sort */
}
nbforms=(char) buffer[(int) *positf]; /* Nombre de forms */
positf=(long *) &buffer[(int) *positf+2]; /* on prend positionnement +int */
for(i=0;i<nbforms;i++) /* on va regarder tous les forms */
{
for(j=0;j<(int) buffer[(int)*positf]; j++) /* sur la longueur du forms */
nomforms[j]=buffer[(int)*positf+j+1]; /* recopie char par char */
nomforms[j++]='\0'; /* fin de chaine */
numforms=(int) buffer[(int) *positf+j]; /* numero de forms */
j+=2; /* un integer */
sizew=(int) buffer[(int)*positf+j]; /* Width */
j+=2; /* un integer */
sizel=(int) buffer[(int)*positf+j]; /* Length */
if (numforms==formsdef && forms==DEFAUT)/* cas specifique du form '0' */
{
forms=formsdef; /* Numero de forms */
formslength=sizel; /* on sauve notre length par defaut */
formswidth=sizew; /* on sauve notre width par defaut */
strcpy(formsname,nomforms); /* on sauve notre Nom par defaut */
printf("No form specified. Defaulting to form %u (%s)\n",
forms,formsname);
close(fic_in); /* On ferme le fichier */
free(buffer); /* On libere notre buffer */
return(OK); /* Pas de probleme */
}
if (numforms==formsdef && forms==SRCHNUM) /*cas specifique de form num */
{
forms=formsdef; /* Numero de forms */
formslength=sizel; /* on sauve notre length par defaut */
formswidth=sizew; /* on sauve notre width par defaut */
strcpy(formsname,nomforms); /* on sauve notre Nom par defaut */
printf("Using form %u (%s)\n",forms,formsname);
close(fic_in); /* On ferme le fichier */
free(buffer); /* On libere notre buffer */
return(OK); /* Pas de probleme */
}
/* Si ils sont identiques */
if(strcmp(nomforms,formsname)==0 && forms==SRCHTXT)
{
forms=numforms; /* Ok pour ce forms */
formslength=sizel; /* Length papier */
formswidth=sizew; /* Width papier */
printf("Using form %u (%s)\n",forms,formsname);
close(fic_in); /* On ferme le fichier */
free(buffer); /* On libere notre buffer */
return(OK); /* Pas de probleme */
}
positf++; /* On passe au suivant */
}
if (forms==DEFAUT) /* On a pas specifie de form */
{
forms=formsdef; /* Ok pour ce form */
formslength=LENGTHDEF; /* Length papier */
formswidth=WIDTHDEF; /* Width papier */
printf("Using form %u\n",forms);
close(fic_in); /* On ferme le fichier */
free(buffer); /* On libere notre buffer */
return(OK); /* Pas de probleme */
}
else
{
printf("Unknown form.\7"); /* le form est inconnu ! -) LISTE */
printf(" Available forms are :\n\n");
positf=(long *) deplace; /* on prend positionnement */
positf=(long *) &buffer[(int)*positf+2]; /* on prend position + int */
for(i=0;i<nbforms;i++) /* on va lister tout les forms */
{
for(j=0;j<(int) buffer[(int)*positf]; j++) /* recopie du forms */
nomforms[j]=buffer[(int)*positf+j+1];/* charactere par charactere */
numforms=(int) buffer[(int)*positf+j+1];/* numero de forms */
for(;j<12;j++)
nomforms[j]=' '; /* On padde avec des blancs */
nomforms[j++]='\0'; /* fin de chaine */
if (nbcol==4) /* si on a deja une ligne pleine */
{
nbcol=0; /* on recommence a zero
printf("\n"); /* on saute une ligne */
}
printf(" %5u %s",numforms,nomforms);
nbcol++; /* Une colonne en plus */
positf++; /* On passe au suivant */
}
if (forms==1) pluriel=32;
printf("\n\n %5u form%c\n",nbforms,pluriel);
close(fic_in); /* On libere le fichier */
free(buffer); /* On libere la memoire */
return(UNKNOWNF); /* pas de forms comme indique */
}
}
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
/* Procedure principale */
/* */
/* ErrorLevel en sortie : 0 - Tout va bien */
/* ARGERR 1 - erreur d'argument */
/* NOSERVER 2 - Pas attache au serveur */
/* NOQUEUE 3 - Pas de queue */
/* NOPRINTSERV 4 - Pas de print server */
/* NEWJOBERR 5 - Erreur de creation de job */
/* NOFILE 6 - Pas de fichier */
/* COPYERR 7 - Erreur lors de la copie */
/* STARTERR 8 - Erreur lors de la validation du JOB */
/* VERSERR 9 - Version DOS trop vieille */
/* NOMEM 10 - Pas assez de memoire (erreur MALLOC). */
/* NOFRMSF 11 - pas de fichier NET$PRN.DAT */
/* BADFRMSF 12 - Mauvais fichier NET$PRN.DAT */
/* ZEROFRMS 13 - Pas de form dans NET$PRN.DAT */
/* UNKNOWNF 14 - Form inconnu */
/* NONOVELL 15 - Pas de novell charge */
/* VERSNOVELL 16 - Netware trop vieux. */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
int main
(
int argc, /* Nombre d'arguments */
char **arg /* Pointeur aux arguments */
)
{
int retour; /* Resultat des Fonctions */
char *mask="*.LST"; /* Par defaut si pas de fichier */
char path[MAXPATH]; /* nom du fichier a traiter */
char drive[MAXDRIVE]; /* Unite */
char dir[MAXDIR]; /* Repertoire */
char filename[MAXFILE]; /* nom du fichier */
char ext[MAXEXT]; /* Extension */
struct ffblk c_file;
char work[1]; /* Chaine de travail */
BYTE majorvers; /* Novell major version */
BYTE minorvers; /* Novell minor version */
BYTE revisionl; /* revision level */
nbarg = argc; /* Nombre d'argument */
retour = testarg(arg); /* On teste nos arguments */
printf("IPRINT - Net Print file V 1.24 %s C.m. I.R.C.I. \n\n",__DATE__);
work[0]=_osmajor;
work[1]=_osminor;
if (work[0] < '\3')
{
printf("IPRINT requires a DOS 3.00 or later...(current is %u.%u)\n\7",
(int) work[0],
(int) work[1]);
return(VERSERR);
}
if(testnovell()!=OK || GetNetWareShellVersion(&majorvers,
&minorvers,
&revisionl)==0)
{
printf("NET shell not loaded.\n\7");
return(NONOVELL);
}
if (majorvers<2 || (majorvers>1 && minorvers<10))
{
printf("IPRINT requires NW 2.10 or later...(This one is %u.%u.%c)\n\7",
(int) majorvers,
(int) minorvers,
(char) revisionl+'A');
return(VERSNOVELL);
}
if (nbarg==2) /* Si iprint /f=0 /... */
mask=arg[1]; /* Parametre passe au programme */
if (nbarg != 2 || retour == CAVAMAL) /* Si on a pas trop d'argument */
{
puts("Usage : IPRINT file_spec [options..]");
puts(" File_spec may be generic.");
puts(" ");
puts("Options are : Default");
puts(" ");
printf(" File extension [.LST]\n");
printf(" /F=Form name/number [%u]\n",formsdef);
printf(" /Q=Queue name [%s]\n",qdefault);
puts(" /C=number of Copies [1]");
puts(" /T=Tab size [8]");
puts(" /NT No tabs");
puts(" /NC Inhibit internal server copy");
puts(" /S Silent mode. Suppress copy progression display");
puts(" ");
retour=ARGERR; /* Arg error */
}
else
{
retour=srchfrms(); /* Met les forms par defaut */
if (retour!=OK) return(retour); /* On rend l'errorlevel */
if(qname==NULL) /* Si on a pas specifie de Queue */
qname=qdefault; /* On lui met la QUEUE par defaut */
if(copy==DEFAUT) /* Nombre d'exemplaires */
copy=1; /* defaut 1 exemplaire */
if(forms==DEFAUT) /* Forms par defaut */
forms=0; /* Defaut par forms */
if(sizetab==DEFAUT) /* Tab size par defaut */
sizetab=8; /* Defaut pour tab size */
fnsplit(mask,drive,dir,filename,ext); /* Decoupage du nom du fichier */
if (ext[0]=='\0')
strcpy(ext,".LST"); /* Normal, ensuite on mettra *.LST */
if (filename[0]=='\0') /* Si on a rien mis */
strcpy(filename,"*"); /* Caractere generique */
fnmerge(path,drive,dir,filename,ext);
if (findfirst(path,&c_file,0)!=CAVAMAL)
{
buffer=malloc((size_t) TAILLEBUF);/* Alloue le buffer de copie. */
if (buffer==NULL)
{
printf("Not enough heap memory...\n\7");
return(NOMEM);
}
do
{
fnsplit(c_file.ff_name,work,work,filename,ext);
fnmerge(path,drive,dir,filename,ext);
retour=traitfile(strupr(path)); /* On traite le fichier path */
}
while (findnext(&c_file)!=CAVAMAL && retour==0);
free(buffer);
}
else
{
printf("File %s not found.\n\7",strupr(path));
retour=NOFILE; /* Error level */
}
}
return(retour); /* On sort avec errorlevel */
}